iT邦幫忙

2022 iThome 鐵人賽

DAY 3
1
自我挑戰組

多人連線遊戲背後的原理與實作系列 第 25

Day25 - 程式實作(玩家移動篇一)

  • 分享至 

  • xImage
  •  

假設我們要在連線遊戲中讓玩家能夠操控一隻角色,使他能夠前後左右走動。
在客戶端中我們需要一個 "PlayerController" 的腳本,裡面會寫關於角色移動的方法,以及玩家的資料(id 、name等等),而我們也需要一個"PlayerManager" 的 Script 來管理、新增、刪除角色(玩家)。
我們還需要一個 "ClientSend" 的Script,來將我們客戶端的訊息傳送至伺服器端。

在PlayerManagerr腳本裡

public static Dictionary<int, PlayerController> playerControllers = new Dictionary<int, PlayerController>();
public GameObject playerPrefab;
public void SpawnPlayer(int _id, string _username, Vector3 _position, Quaternion _rotation)
{
    GameObject _player;
    _player = Instantiate(playerPrefab, _position, _rotation);
    _player.GetComponent<PlayerController>().Initialize(_id);
    playerControllers.Add(_id, _player.GetComponent<PlayerController>());
}

在PlayerController腳本裡

public int id;
private void FixedUpdate()    
{ 
    SendInputToServer();    
}  
private void SendInputToServer()    
{ 
    bool[] _inputs = new bool[]
    { 
        Input.GetKey(KeyCode.W), Input.GetKey(KeyCode.S), Input.GetKey(KeyCode.A), Input.GetKey(KeyCode.D),};  ClientSend.PlayerMovement(_inputs);    
    }

在ClientSendr腳本裡

public static void PlayerMovement(bool[] _inputs)    
{ 
    using (Packet _packet = new Packet((int)ClientPackets.playerMovement))       
    { 
        _packet.Write(_inputs.Length); 
        foreach (bool _input in _inputs)            
        { 
            _packet.Write(_input);            
        } 
        _packet.Write(GameManager.players[Client.instance.myId].transform.rotation);
        SendUDPData(_packet);        
    }    
}

上一篇
Day24 - 程式實作(寄送封包篇三)
下一篇
Day26 - 程式實作(玩家移動篇二)
系列文
多人連線遊戲背後的原理與實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言